﻿using System;
using System.Net;
using System.Net.Sockets;

namespace CS.Beehive
{
    /// <summary>
    /// 连接通道
    /// </summary>
    public interface ITcpChannel
    {

        #region 属性

        /// <summary>
        /// 客户端Id编号
        /// </summary>
        long ClientId { get; }

        /// <summary>
        /// 会话创建时间
        /// </summary>
        DateTime CreateTime { get; }

        /// <summary>
        /// 与客户端相连的Socket
        /// <remarks>
        /// 即上下文的 SocketAsyncEventArgs.AcceptSocket
        /// </remarks>
        /// </summary>
        Socket ChannelSocket { get; }

        /// <summary>
        /// 连接的EndPoint
        /// </summary>
        IPEndPoint EndPoint { get; }

        /// <summary>
        /// TcpServer
        /// </summary>
        TcpServer Server { get; set; }
        /// <summary>
        /// 最后活动时间(获取系统启动后运行到当前的时间，毫秒：Environment.TickCount)
        /// </summary>
        int ActiveTickCount { get; }
        /// <summary>
        /// 用户相关的附加信息
        /// </summary>
        object Tag { get; set; }

        /// <summary>
        /// 名称
        /// </summary>
        string Name { get; set; }


        /// <summary>
        /// 指示数据在此计算机结构中存储时的字节顺序
        /// <remarks>
        /// 如果结构为 Little-endian，则该值为 true；如果结构为 Big-endian，则该值为 false。
        /// 不同的计算机结构采用不同的字节顺序存储数据。
        /// " Big-endian”表示最大的有效字节位于单词的左端。
        /// " Little-endian”表示最大的有效字节位于单词的右端。
        /// </remarks>
        /// </summary>
        bool IsLittleEndian { get; set; }

        #endregion


        #region 事件

        ///// <summary>
        ///// TcpChannel 开始断开时
        ///// </summary>
        //event EventHandler<ChannelDisconnectEventArgs> ChannelDisconnecting;
        /// <summary>
        /// Tcp断开连接完成
        /// </summary>
        event EventHandler<ChannelDisconnectEventArgs> ChannelDisconnected;
        /// <summary>
        /// 数据接收事件
        /// </summary>
        event EventHandler<SocketAsyncEventArgs> DataReceived;
        /// <summary>
        /// Channel里的异常
        /// </summary>
        event EventHandler<TcpExceptionEventArgs> TcpException; 

        #endregion


        #region 方法

        /// <summary>
        /// 开始接受来自客户的数据
        /// </summary>
        void BeginReceive();

        /// <summary>
        /// 主动断开连接
        /// </summary>
        void Disconnect();

        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="datagram"></param>
        void Send(byte[] datagram);

        /// <summary>
        /// 获取关服因由
        /// </summary>
        /// <returns></returns>
        string GetCloseReason();

        /// <summary>
        /// 异常通知
        /// </summary>
        /// <param name="e"></param>
        void OnChannelException(TcpExceptionEventArgs e);


        #endregion


    }
}